Sıralama algoritması, bilgisayar bilimlerinde ya da matematikte kullanılan, verilen bir listenin elemanlarını belirli bir sıraya sokan algoritmadır. En çok kullanılan sıralama türleri, sayı büyüklüğüne göre sıralama ve alfabetik sıralamadır. Sıralama işleminin verimli yapılması, arama ve birleştirme algoritmaları gibi çalışması için sıralanmış dizilere gereksinim duyan algoritmaların başarımının yüksek olması için önemlidir. Sıralama algoritmaları bilgisayarlarda tutulan verilerin düzenlenmesini ve insan kullanıcı tarafından daha rahat algılanmasını da sağlar.
Sıralama algoritmaları, tanımı çok yalın olmasına karşın çözümü çok karmaşık olan bir işi gerçekleştirdikleri için, üzerinde en fazla araştırma yapılan bilgisayar bilimi konularından biridir. Çoğu kişi sıralama sorununu çözülmüş bir sorun olarak görse de, yeni sıralama algoritmaları üzerinde araştırmalar sürmektedir. Örneğin kütüphane sıralaması ilk olarak 2004 yılında ortaya atılmıştır. Sıralama algoritmaları, sayılarının çok olması ve değişik yaklaşımlar sunmaları nedeniyle özellikle giriş düzeyindeki bilgisayar bilimleri derslerinde büyük O gösterimi ve veri yapıları gibi temel algoritma kavramlarının açıklanması amacıyla yaygın biçimde kullanılırlar.
Bilgisayar bilimlerinde kullanılan sıralama algoritmaları genellikle aşağıdaki ölçütlere göre sınıflandırılır:
Kararlı sıralama algoritmaları sıralanacak dizinin içinde değerleri birbirine eşit olan öğerlerin birbirlerine göre olan konulmlarını korur. Başka bir deyişle, bir sıralama algoritması kararlı olduğunda, eğer R ve S gibi içerdiği değer aynı olan iki öğe bulunduran asıl dizide, R, *S'*den önce geliyorsa, sıralanmış dizide de R, S'den önce olur.
Dizinin içinde birbirine eşit değerler içeren öğeler birbirlerinden ayırt edilemiyorsa (örneğin sayılar ya da harfler gibi değerler öğenin kendisini oluşturuyor ise) kararlılık bir sorun değildir. Ancak aşağıda gösterildiği gibi sayı çiftleri, her çiftin virgülden önceki sayısına göre sıralanacağı düşünülürse kararlılık sorunu ortaya çıkar.
(4, 1) (3, 7) (3, 1) (5, 6)
Bu durumda, 2 değişik sonuç mümkündür; ilk çözüm sıralama anahtarlarının değerleri aynı olan öğelerinin sırasını korur, ikincisi ise korumaz:
(3, 7) (3, 1) (4, 1) (5, 6) (sıra korunmuş)
(3, 1) (3, 7) (4, 1) (5, 6) (sıra değişmiş)
Kararsız sıralama algoritmaları sıralama anahtarlarının değerleri aynı olan öğelerin dizi içindeki sırasını değiştirebilir ancak kararlı sıralama algoritmaları asla değiştirmez. Kararsız sıralama algoritmaları özellikle kararlı olacak biçimde uygulanabilir. Bunu yapmanın bir yolu yapay olarak anahtar karşılaştırmasını anahtlarının değerleri birbirine eşit olan iki öğenin durumunu belirlemek için asıl listedeki konumlarını ölçüt olarak kullanacak biçimde genişletmektir. Ancak asıl dizideki öğre sırasının hatırlanması çoğu zaman ek saklama alanı gerektirir.
Aşağıdaki tablolarda n dizideki sıralanacak olan eleman sayısını gösterir. "Ortalama" ve "En Kötü" kolonları ilgili durumlardaki karmaşıklığı, "Bellek" kolonu ise listenin sıralanabilmesi için listenin bellekte kapladığı alandan ne kadar daha fazla saklama alanı gerektiğini gösterir.
Adı | Ortalama | En Kötü | Bellek | Kararlı mı? | Yöntem | Diğer Açıklamalar |
---|---|---|---|---|---|---|
nowrap align="left"|Kabarcık Sıralaması | — | O(n²) | O(1) | Evet | Değiştirme | |
nowrap align="left"|Kokteyl Sıralaması | — | O(n²) | O(1) | Evet | Değiştirme | |
nowrap align="left"|Tarak Sıralaması | O(n log n) | O(n log n) | O(1) | Hayır | Değiştirme | nowrap align="left"|Küçük boyutta kodla uygulanabilir |
nowrap align="left"|Cüce Sıralaması | — | O(n²) | O(1) | Evet | Değiştirme | |
nowrap align="left"|Seçmeli Sıralama | O(n²) | O(n²) | O(1) | Hayır | Seçme | nowrap align=left| Kararlı bir sıralama olarak uygulanabilir |
Eklemeli Sıralama | O(n + d) | O(n²) | O(1) | Evet | Ekleme | nowrap align=left| d ters çevirme sayısıdır ve O(n²)'dir |
nowrap="" align="left" |Shell Sıralaması | — | O(n log² n) | O(1) | Hayır | Ekleme | |
nowrap align="left"|Ağaç Sıralaması | O(n log n) | O(n log n) | O(n) | Evet | Ekleme | nowrap align="left"|Kendini dengeleyen bir ikili arama ağacında kullanıldığında |
nowrap align="left"|Kütüphane Sıralaması | O(n log n) | O(n²) | O(n) | Evet | Ekleme | |
nowrap align="left"|Birleştirmeli Sıralama | O(n log n) | O(n log n) | O(n) | Evet | Birleştirme | |
nowrap align="left"|Yerinde Birleştirmeli Sıralama | O(n log n) | O(n log n) | O(1) | Evet | Birleştirme | nowrap align="left"| Örnek uygulamasını gösteren sayfa: 1 |
nowrap align="left"|Yığın Sıralaması | O(n log n) | O(n log n) | O(1) | Hayır | Seçme | |
nowrap align="left"|Rahat Sıralama | — | O(n log n) | O(1) | Hayır | Seçme | |
nowrap align="left"|Hızlı Sıralama | O(n log n) | O(n²) | O(log n) | Hayır | Bölümlendirme | nowrap align="left"| Yalın uygulamaları O(n) kadar bir alan kullanır; ortada bir pivot kullanılırsa en kötü durumda O(n log n) olabilir |
nowrap align="left"|İçgözlemle Sıralama | O(n log n) | O(n log n) | O(log n) | Hayır | Melez | nowrap align="left"| Standart Şablon Kütüphanelerinin çoğunda kullanılır |
nowrap align="left"|Sabır Sıralaması | — | O(n²) | O(n) | Hayır | Ekleme | O(n log n) zamanda bütün en uzun artan altdizileri bulur |
nowrap align="left"|İplik Sıralaması | O(n log n) | O(n²) | O(n) | Evet | Seçme |
Aşağıdaki tablo karşılaştırma kullanmadan sıralama yapan sıralama algoritmalarını göstermektedir. Bu algoritmalar karşılaştırma yapmadıkları için karmaşıklıklarınınO(n log n) gibi bir alt sınırı yoktur. Tabloda gösterilen karmaşıklıklar sıralanacak listedeki eleman sayısı (n), her bir anahtarın boyutu (k) ve uygulama tarafından kullanılan parça boyutu (k) cinsiden yazılmıştır. Algoritmaların pek çoğu anahtar boyutunun bütün satırlarda özgün anahtar değerleri olmasını sağlayacak kadar büyük ve n << 2<sup>k</sup> ('<<' = "çok daha küçük") olduğunu varsayar.
Adı | Ortalama | En Kötü | Bellek | Kararlı mı? | n << 2<sup>k</sup> ? | Diğer Açıklamalar |
---|---|---|---|---|---|---|
nowrap align="left"|Güvercin Yuvası Sıralaması | O(n+2<sup>k</sup>) | O(n+2<sup>k</sup>) | O(2<sup>k</sup>) | Evet | Evet | |
nowrap align="left"|Kova Sıralaması | O(n•k) | O(n²•k) | O(n•k) | Evet | Hayır | nowrap align="left"|Elemanların dizide düzenli olarak dağıldığını varsayar. |
nowrap align="left"|Sayarak Sıralama | O(n+2<sup>k</sup>) | O(n+2<sup>k</sup>) | O(n+2<sup>k</sup>) | Evet | Evet | |
nowrap align="left"|En anlamsız Basamağa göre sıralama | O(n•k/s) | O(n•k/s) | O(n) | Evet | Hayır | |
nowrap align="left"|En anlamlı Basamağa göre sıralama | O(n•k/s) | O(n•(k/s)•2<sup>s</sup>) | O((k/s)•2<sup>s</sup>) | Hayır | Hayır | |
nowrap align="left"|Spreadsort | O(n•k/log(n)) | O(n•(k - log(n))<sup>.5</sup>) | O(n) | Hayır | Hayır | nowrap align="left"|Asimtotlar n << 2<sup>k</sup> varsayımına dayanır, ancak algoritmanın buna gereksinimi yoktur. |
Aşağıdaki tablo çok verimsiz oldukları ya da özel bir donanım gerektirdikleri için gerçek hayatta kullanılması olumlu sonuçlar vermeyecek sıralama algoritmalarını göstermektedir.
Adı | Ortalama | En Kötü | Bellek | Kararlı mı? | Karşılaştırma sıralaması mı? | Diğer Açıklamalar |
---|---|---|---|---|---|---|
nowrap align="left"|Saçma sıralama | nowrap|O(n × n!) | nowrap|∞ | O(1) | Hayır | Evet | Knuth karıştırması kullanılarak ortalama zamanı |
nowrap align="left"|Rastgele değiştirmeli sıralama | nowrap|O(n × n!) | nowrap|∞ | O(1) | Hayır | Evet | Ortalama zamanı sonuşmayan biçimde saçma sıralamanın yarısıdır |
nowrap align="left"|Stooge sort | nowrap|O(n<sup>2.71</sup>) | nowrap|O(n<sup>2.71</sup>) | O(log n) | Hayır | Evet | |
nowrap align="left"|Bead sort | N/A | N/A | — | N/A | Hayır | nowrap align="left"| Özel donanım gerektirir |
nowrap align="left"|Simple pancake sort | O(n) | O(n) | O(log n) | Hayır | Evet | nowrap align="left"| Sayı, yapılan değişiklik sayısıdır |
nowrap align="left"|Sorting networks | nowrap|O(log n) | nowrap|O(log n) | O(n•log n) | Evet | Hayır | nowrap align="left"| O(n•log n) boyutunda özel bir devre gerektirir |
Orijinal kaynak: sıralama algoritması. Creative Commons Atıf-BenzerPaylaşım Lisansı ile paylaşılmıştır.
Ne Demek sitesindeki bilgiler kullanıcılar vasıtasıyla veya otomatik oluşturulmuştur. Buradaki bilgilerin doğru olduğu garanti edilmez. Düzeltilmesi gereken bilgi olduğunu düşünüyorsanız bizimle iletişime geçiniz. Her türlü görüş, destek ve önerileriniz için iletisim@nedemek.page